package edu.ensabap.matricula.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import edu.ensabap.matricula.bean.AlumnoDTO;
import edu.ensabap.matricula.constants.MySQlQuery;
import edu.ensabap.matricula.constants.RowMapperConstants;



@Repository
public class AlumnoDAO {
	
	
	private SimpleJdbcTemplate simpleJdbcTemplate;
    private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	
	@Autowired
	public void init(DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.jdbcTemplate=new JdbcTemplate(dataSource);
		this.namedParameterJdbcTemplate=new NamedParameterJdbcTemplate(dataSource);
		
	} 
	@SuppressWarnings("unchecked")
	public List<AlumnoDTO> listarAlumnosPaginado(AlumnoDTO a,int paginaActual,int cantidadFilas){
		System.out.println("ingreso al dao listar alumnos paginado");
		StringBuffer sqlb= new StringBuffer();
		if(a.getCodigo()!=null){
			sqlb.append(" and codigo LIKE '"+a.getCodigo()+"%' ");
		}
		if(a.getNombre()!=null){
			sqlb.append(" and nombre LIKE '"+a.getNombre()+"%' ");
		}
		if(a.getApellido()!=null){
			sqlb.append(" and apellido LIKE '"+a.getApellido()+"%' ");
		}
		if(a.getCiclo()!=0){
			sqlb.append(" and ciclo = "+a.getCiclo()+" ");
		}
		if(a.getTelefono()!=null){
			sqlb.append(" and telefono LIKE '"+a.getTelefono()+"%' ");
		}
				
		
//		para el listado
		StringBuffer sqlbListado = new StringBuffer(MySQlQuery.LISTAR_ALUMNOS);
		sqlbListado.append(sqlb.toString());
//		 calculando el inicio
		int inicio = (paginaActual-1)*cantidadFilas;
//		agregajmmos el limit
		
		sqlbListado.append( " order by idalumno LIMIT "+cantidadFilas+" OFFSET "+inicio );
		String sql=sqlbListado.toString();
		
		System.out.println("EL SQL ES :"+sql);
		
		return this.jdbcTemplate.query(sql, new RowMapperConstants.AlumnoMapper());
	}
	
	
//	numero de paginas
	public int numeroPaginas(AlumnoDTO a,int cantidadFilas){
		
		StringBuffer sqlb= new StringBuffer();
		if(a.getCodigo()!=null){
			sqlb.append(" and codigo LIKE '"+a.getCodigo()+"%' ");
		}
		if(a.getNombre()!=null){
			sqlb.append(" and nombre LIKE '"+a.getNombre()+"%' ");
		}
		if(a.getApellido()!=null){
			sqlb.append(" and apellido LIKE '"+a.getApellido()+"%' ");
		}
		if(a.getCiclo()!=0){
			sqlb.append(" and ciclo = "+a.getCiclo()+" ");
		}
		if(a.getTelefono()!=null){
			sqlb.append(" and telefono LIKE '"+a.getTelefono()+"%' ");
		}
		
		
//		obtener la cantidad de registros
		StringBuffer sqlbcantidadRegistros=new StringBuffer(MySQlQuery.CANTIDAD_REGISTROS);
		sqlbcantidadRegistros.append(sqlb.toString());
		String cantidadRegistros=sqlbcantidadRegistros.toString();
		
//		obtengo la cantidad de registros
		int cantidad=this.simpleJdbcTemplate.queryForInt(cantidadRegistros);
		
		int numeroDePaginas;
		
		//primero el cociente
		numeroDePaginas = cantidad/cantidadFilas;
		//ahora el residuo
		if(cantidad%cantidadFilas>0)numeroDePaginas++;
		
		return numeroDePaginas;
	}        

	
	public int eliminar(AlumnoDTO a){

		String sql=MySQlQuery.ELIMINAR_ALUMNO;
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("p_id",a.getId());
		
		System.out.println("el sql es :"+sql);
		System.out.println("en el dao el id es :"+a.getId());
		
		return this.simpleJdbcTemplate.update(sql,param);
	}
	
	
	

	
	
	
	@SuppressWarnings("unchecked")
	public List<AlumnoDTO> obtenerXID(AlumnoDTO a){
		
		StringBuffer sb = new StringBuffer();
		sb.append(MySQlQuery.LISTAR_ALUMNOS);
		if(a.getId()!=0){
			sb.append( " and al.id= "+ a.getId()+" " );
		}
		
		String sql =  sb.toString();
		
		return this.jdbcTemplate.query(sql, new RowMapperConstants.AlumnoMapper());	
	}
	
	
	public int insertar(AlumnoDTO a){
		System.out.println("ingreso al insertar");
		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("p_codigo",a.getCodigo());
		parametros.put("p_nombre",a.getNombre());
		parametros.put("p_apellido",a.getApellido());
//		parametros.put("p_sexo",a.getSexo().getId());
		parametros.put("p_sexo",1);
		parametros.put("p_telefono",a.getTelefono());
		parametros.put("p_ciclo",a.getCiclo());
		String sql = MySQlQuery.INSERTAR_ALUMNO;
		
		return this.simpleJdbcTemplate.queryForInt(sql,parametros);
	}
	
	
	public int modificar(AlumnoDTO a){
		System.out.println("ingreso al modificar");
		Map<String, Object> parametros = new HashMap<String, Object>();
		
		parametros.put("p_idalumno",a.getId());
		parametros.put("p_idpersona",a.getIdpersona());
		
		parametros.put("p_codigo",a.getCodigo());
		parametros.put("p_nombre",a.getNombre());
		parametros.put("p_apellido",a.getApellido());

		parametros.put("p_sexo",1);
		parametros.put("p_telefono",a.getTelefono());
		parametros.put("p_ciclo",a.getCiclo());
		
		System.out.println("ingreso a modificar en el DAO");
		System.out.println("el nuevo codigo es :"+a.getCodigo());
		System.out.println("el nuevo nombre es :"+a.getNombre());
		System.out.println("el nuevo apellido es :"+a.getApellido());
		System.out.println("el nuevo telefono es :"+a.getTelefono());
		
		
		String sql = MySQlQuery.ACTUALIZAR_ALUMNO;
		
		return this.simpleJdbcTemplate.queryForInt(sql,parametros);
	}
	
}
